/*
 * Le TransferHandler pour le drag&drop
 */
package chipwits.dnd;

import chipwits.operator.OpType;
import chipwits.operator.Op_base;
import chipwits.operator.Op_case;
import chipwits.operator.Operator;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import javax.swing.JComponent;
import javax.swing.TransferHandler;

/**
 *
 * @author Emmanuel Roussel
 */
public class DnDTransferHandler extends TransferHandler {

    @Override
    public boolean canImport(JComponent cp, DataFlavor[] df) {      //détermine si cp (=le destinataire) peut accepter les DataFlavor df
        if ((((Operator) cp) instanceof Op_base) && (((Operator) cp).type.getType() != OpType.Type.POUBELLE)) {   //si c'est un opérateur de base (sauf poubelle), n'importe pas
            return false;
        }
        if (!((Operator) cp).type.isVIDE() && ((Operator) cp).type.getType() != OpType.Type.POUBELLE) {     //si la destination n'est pas vide (ou poubelle) marche pas
            return false;
        }
        for (int i = 0; i < df.length; i++) {
            if (df[i].equals(TransferableData.mData)) {
                return true;
            }
            if (df[i].equals(DataFlavor.stringFlavor)) {
                return true;
            }
        }
        return false;
    }

    @Override
    public boolean importData(JComponent cp, Transferable df) {     //se produit quand un composant source transmet des données via le transferHandler
        if (df.isDataFlavorSupported(TransferableData.mData)) {     //si l'importation est autorisée,
            try {
                Object mObject = df.getTransferData(TransferableData.mData);
                DnDData value = (DnDData) mObject;      //l'objet transmis
                if(((Operator) cp) instanceof Op_case){     //inutile en vrai : cf canImport.
                    ((Op_case) cp).changeType(value.getType(), value.getArrows()); //on change le type du destinataire.
                    ((Op_case) cp).select();
                }
                return true;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return false;   //si pb on fait rien
    }
}
